😗 실습 사이트
1. 변수1. 선언1.2 변수 타입2. 함수2.1 함수 선언2.2 변수 기본 값 선언3. 컬렉션3.1 Array (배열)3.2 List3.3 Set3.4 Map4. 조건문과 반복문4.1 조건문4.2 반복문 for과 while
1. 변수
1. 선언
다음과 같이 변경 가능한 변수는
var
변경 불가능한 변수는 val
로 선언합니다.//val 변수명: 타입=값 => 초기값이 할당되면 바꿀 수 없는 변수 val number1: Int = 1 //var 변수명: 타입=값 => 초기값 var number2: Int = 2
코틀린의 모든 타입은 객체임으로 변수에 null을 대입할 수 있습니다. 대신
선언할 때 null을 대입할 수 있는 변수인지, null을 대입할 수 없는 변수인지
?로 구분하여
명확하게 선언하여야 합니다// null 허용 val v1: Int? = null // null 불허 val v2: Int = null // 에러 val v3: Int = 10 // 정상
초기화를 해야 하는 변수 vs 하지 않아도 되는 변수
🔎 해야 하는 변수
최상위에 선언한 변수(전역 변수)
클래스의 멤버 변수
// 코드 최상위 val topVal: Int = 10 class User { // 클래스 멤버 변수 (java와 동일) val age: Int = 10 }
- 생성자를 통해 선언 시 바로 초기화가 된다면 반드시 값을 명시할 필요는 없습니다.
🔎 하지 않아도 되는 변수
함수 내부에 선언한 변수
초기화를 미룬 변수
초기화를 미룬 변수?
🤪 lateinit
lateinit
으로 선언한 변수는 초기 값을 할당하지 않아도 됩니다. 다만!- var 키워드로 선언한 변수이거나
int, Long, Short, Double, Float, Boolean, Byte
타입에는사용할 수 없습니다.
🤪 lazy
변수 뒤에 붙는 접미사로 변수 선언 뒤에
by lazy { 내용 } 형식
으로 선언되며 변수가 최초로 이용되는 순간 중괄호로 묶은 부분이 자동으로 실행
되어 그 결괏값이 변수의 초기값으로 할당됩니다.초기화를 하지 않아도 되는 것들에 대한 예시입니다.
function ff() { // 함수 내에 있는 변수 : 초기화 안해도 됨 var inFunc: Int } // lateinit ( 초기화를 나중에 ) lateinit var abcd: String fun main() { abcd = "abcd" println("haha is hahaha $abcd") } // by lazy { 내용 } ( 최초로 변수가 이용 시 내용에 의해서 트리거 ) val llaazzyy: Int by lazy { println("결국 마지막 줄의 실행 결과로 초기화 됩니다.") 10 } fun main() { println("haha is hahaha $llaazzyy") //결과 : "결국 마지막 줄로 초기화 됩니다. haha is hahaha 10" }
1.2 변수 타입
코틀린의 모든 변수는
객체
입니다. 이는 즉 변수에 메서드가 존재하며, Int 타입의 변수에 null을 대입할 수도 있습니다. (?를 붙인 경우)var num1: Int = 123 var num2: Int? = null // 객체의 메서드 이용 var wow = num1.plus(10) // wow = 133
기초 타입 객체
기초 데이터형을 의미하며, 정수를 표현하는
Int, Short, Long
, 실수를 표현하는 Double, Float
, 이진수를 표현하는 Byte
, 참/거짓을 표현하는 Boolean
타입이 존재합니다.😎 타입 선언은 다음과 같습니다.
// 정수 val t1: Int = 123 val t2: Short = 123 val t3: Long = 10L // 실수 val t4: Float = 10.0f val t5: Double = 10.0 // 이진수 val t6: Byte = 0b10001 // 참, 거짓 val t7: Boolean = true
문자와 문자열
Char
은 문자를 표현하는 타입이며 '
를 이용하여 선언합니다.String
은 문자’열’ 을 표현하는 타입이며 ""
혹은 """
로 감싸서 표현합니다.문자열 템플릿
의 경우 ${변수}
형태로 문자열 내에서 사용됩니다.😎 예시 입니다.
val AlpabetA = 'A' val str1 = "String" val str2 = """ abcde """ println("str1 is ${str1}") // str1 is String
모든 타입이 가능한 타입 (Any)
Any
는 코틀린에서 최상위 클래스
입니다. 따라서 Any타입으로 선언한 변수에는 모든 타입의 데이터를 할당할 수 있습니다.반환(return)이 없는 함수
Unit
타입으로 선언한 변수에는 Unit 객체만 대입할 수 있습니다. 보통 함수에서 반환문이 없음을 명시적으로 나타낼 때 사용
됩니다fun some(): Unit { println(1 + 1) }
함수를 선언할 때 반환 타입을 생략하면 자동으로 Unit이 적용됩니다.
null이나 예외를 반환하는 함수 (Nothing)
Nothing도 Unit과 마찬가지로 의미 있는 데이터가 아니라 특수한 상황을 표현합니다.
Nothing으로 선언한 변수에는 null만 대입할 수 있습니다.
val data: Nothing? = null // 주로 함수의 반환 타입에 사용 fun f1(): Nothing? { return null } fun f2(): Nothing? { throw Exception() }
2. 함수
2.1 함수 선언
코틀린에서 함수를 선언할 때는
fun
키워드를 이용합니다.선언 방식은 다음과 같습니다.
fun 함수명(매개변수이름: 타입): 반환타입 { 함수내용 } fun tenten(data:Int): Int { return data * 100 }
2.2 변수 기본 값 선언
매개변수에 값이 없다면 기본 값을 넣어줄 수 있습니다.
fun tenten(data: Int = 10): Int { return data }
또한 해당 함수를 선언할 때, 매개변수를 지정하여 호출할 수도 있습니다.
fun pls(data1: Int, data2: Int): Int { return data1 + data2 } pls(data2 = 123, data1 = 456)
3. 컬렉션
3.1 Array (배열)
코틀린의 배열은 Array 클래스로 표현합니다. 처음 생성할 때
첫 번째 인자는 배열의 크기, 두번째 인자는 초깃값을 지정하는 함수
입니다.선언
// Int형 크기 3짜리 배열 val arr1: Array<Int> = Array(3, { 0 }) // String형 크기 4짜리 배열 공백으로 선언 val arr2: Array<String> = Array(4, {""} // 제네릭 형식이 아닌 기초 타입의 배열 val arr1: IntArray = IntArray(3, { 0 }) val arr2: BooleanArray = BooleanArray(3, { false }) val arr3: ByteArray = ByteArray(3, { 0 }) // ... CharArray, DoubleArray, FloatArray, LongArray, ShortArray
데이터 접근
val arr1: Array<Int> = Array(3, { 0 }) // arrayOf를 이용한 선 val arr2: arrayOf<Int> (10, 20, 30) // Index 형식 arr1[0] = 1 arr1[1] = 2 // get set 방식 arr1.set(0) = 1 arr1.set(1) = 2 // 기초 타입을 대상으로 하는 arrayOf val arr1 = intArray(1, 2, 3) val arr2 = booleanArrayOf(true, false) //... charArrayOf, doubleArrayOf, floatArrayOf, longArrayOf, shortArrayOf
3.2 List
순서가 있는 데이터의 집합으로
데이터의 중복을 허용합니다.
배열과 List의 차이는
배열(Array)은 길이를 변경할 수 없지만 List는 선언시 MutableList로 선언하면 길이를 변동시킬 수 있습니다.
가변 클래스 / 불변 클래스
Collection 타입의 클래스는 가변 클래스와 불변 클래스로 나뉘는데,
불변 클래스는 초기에 데이터를 대입하면 더 이상 변경할 수 없는 타입
입니다. 하지만 가변 클래스는 초깃값을 대입한 이후에도 데이터를 추가하거나 변경
할 수 있습니다. 보통 변하기 쉬운이라는 뜻인 mutable
을 사용합니다.🔎 List
불변
: listOf()
가변
: mutableListOf()
➡️ 예시
// 불변 var list = listOf<Int>(10, 20, 30) // 가변 add() set() 이용 가능 var mutableList = mutableListOf<Int>(10,20,30)
3.3 Set
순서가 없으며
데이터의 중복을 허용하지 않습니다.
🔎 Set
불변
:setOf()<객체 타입>
가변
:mutableSetOf()<객체 타입>
➡️ 예시
// 불변 var s = setOf<Int>(10, 20, 30) // 가변 add() set() 이용 가능 var sList = mutableSetOf<Int>(10,20,30)
3.4 Map
키와 값으로 이루어진 데이터 집합으로, 순서가 없으며
키의 중복은 허용하지 않습니다.
key와 value를 넣을때는
“Pair(’key’, ‘value’)"
처럼 객체로 표현하거나 "key" to "value"
형식을 사용합니다.- 두개를 같이 써도 상관 없습니다.
🔎 Map
불변
: mapOf()
가변
: mutableMapOf()
➡️ 예시
// 불변 var m1 = mapOf<String, String>(Pair("a", "apple")) //pair var m2 = mapOf<String, String>("b" to "banana")) // key to value // 이런식으로 사용 가능 fun main() { var m1 = mapOf<String, String>(Pair("a", "apple")) var m2 = mapOf<String, String>("b" to "banana") println("${m1.get("a")}, ${m2.get("b")}") }
4. 조건문과 반복문
4.1 조건문
기본
다른 언어의 조건문과 동일합니다.
if (조건1) { 수행 } else if (조건2){ 수행 } else { 수행 }
표현식을 이용한 사용
val data1 = if (value > 0) { println("양수") true } else { println("음수 혹은 0") false }
value가 0 이상
이라면 data1에true가 저장
,아니면 false
가 저장됩니다.
조건문 when
when 키워드는 소괄호 안에 넣은 데이터가 조건이 되고, 이 값에 따라 각 구문을 실행합니다
when (data) { "hello" -> println("hello") "world" -> println("world) else -> { println("no helloworld?!?!?") } }
각 구문을 다양하게 설정해 줄 수 있습니다.
when (data) { is String -> println("흠.. 일단 문자열이군") 20, 30 -> println("20이거나 30이군") in 1..10 -> println("1과 10 사이의 수이군!") else -> println("뭔데 이건") } // 데이터 명시 x when { data <=0 -> println("흠.. 일단 0보다 작군") else -> println("흠.. 일단 0보다 크군") }
- 상단부터 맞는 부분에서 멈춰 실행합니다.
- data 부분을 생략하고 조건 식 자체를 선언해 줄 수 있습니다.
표현식으로도 사용이 가능합니다.
val result when { data <= 0 -> "data is <=0" data > 100 -> "data is > 100" else -> "data is wtf" }
- else는 반드시 들어가야 합니다.
4.2 반복문 for과 while
for문
// 기본 for ( 조건 ) { 반복할 구문 } // 조건 for (i in 1..10) // 1부터 10까지 1씩 증가 for (i in 1 until 10) //1부터 10 전까지 1씩 증가 (10 미포함) for (i in 1..10 step 2) //1부터 10까지 step 2씩 증가 for (i in 10 downTo 1) // 10부터 1까지 1씩 감소 // 컬렉션 조건 for (i in data.indices) // 데이터 개수만큼 for ((index, value) in data.withIndex()) // 인덱스와 값을 가져옴
파이선과 자바를 섞어놓은듯함
while 문
while (조건) { 반복문 }